#多线程
'''
多线程并不是多个线程并发在同一时点运行，而是CPU有计划的交替
执行多个线程。

计算为主的程序  CPU密集型程序

磁盘或网络为主的程序  IO密集型

'''
#线程执行代码的封装

#定义一个线程类
'''
1）继承Thread
2）重构run方法
'''
"""
from threading import Thread
import time
class Ourthread(Thread):  #定义一个新子类来继承Thread
    #重构run方法，规定run这个名字，表示线程活动的方法
    def run(self):
        print('重温对象')
        time.sleep(2)
        print('你们还找得着北吗？')

if __name__=='__main__':
    #创建线程实例
    t1 = Ourthread()
    t1.start()      #启动线程，start会调用run方法
print('========================================================')
print('\n')
"""

#拓展 start 和 run 方法的区别
'''
start方法是声明分到一个子线程的函数已经就绪，等待被CPU执行；
run方法是执行到这个子线程时，自动调用的方法。

'''
import threading
from threading import Thread
class Ourthread(Thread):
    def run(self):
        print(f'当前线程：{threading.current_thread().name}\n',end='')  #当前线程名

if __name__=='__main__':
    #创建线程实例
    t1 = Ourthread()
    t2 = Ourthread()

    #启动线程
    t1.start()    #当前线程：Thread-1
    t2.start()    #当前线程：Thread-2

    #run方法启动
    t1.run()      #当前线程：MainThread
    t1.run()      #当前线程：MainThread
print('========================================================')
print('\n')



   
#1.线程之间执行时无序的，它是由CPU调用来决定的。
"""
import threading
import time

def task():
    time.sleep(1)
    print(f'当前线程：{threading.current_thread().name}\n',end='')  #显示当前线程名

if __name__=='__main__':
    for i in range(5):
        t = threading.Thread(target=task)
        t.start()
print('\n')
"""



#2.多线程资源共享

from threading import Thread
import time
list1 = [] #全局变量

#写数据
def writedata():
    for i in range(5):
        list1.append(i)
        time.sleep(0.2)
    print(f'写入的数据：{list1}\n',end='')

#读数据
def readdata():
    print(f'读取的数据：{list1}\n',end='')

if __name__=='__main__':
    #创建写入数据的线程
    wd = Thread(target=writedata)
    #创建读取数据的线程
    rd = Thread(target=readdata)
    #启动线程
    wd.start()
    wd.join()             #阻塞主线程
    rd.start()
    print('哈哈哈……')   #这是主线程









